﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.nowcoder.com/practice/3bcf72c738b6494bbe1ebe0ffde56152?tpId=230&tqId=40419&ru=/exam/oj
/*
题目描述：
描述
给定一个长度为 n 的仅包含正整数的数组，另外有一些操作，每次操作你可以选择数组中的任意一个元素
𝑎
𝑖

a
i
​
   ，同时数组中所有等于
𝑎
𝑖
−
1

a
i
​
 −1  和
𝑎
𝑖
+
1

a
i
​
 +1  的元素会被全部移除，同时你可以得到
𝑎
𝑖

a
i
​
   分，直到所有的元素都被选择或者删除。
请你计算最多能得到多少分。
数据范围： 数组长度满足
1
≤
𝑛
≤
1
0
5

1≤n≤10
5
   ，数组中的元素大小都满足
1
≤
𝑎
𝑖
≤
1
0
4

1≤a
i
​
 ≤10
4

输入描述：
第一行输入一个正整数 n 表示数组的长度
第二行输入 n 个数字表示数组的各个元素值。
输出描述：
输出能得到的最大分数。
示例1
输入：
2
1 2
复制
输出：
2
复制
说明：
直接选择元素 2 ，然后 1 被同时移除。

示例2
输入：
3
1 2 3
复制
输出：
4
复制
说明：
先选择 3 ，同时 2 被移除，再选择 1 ，即得到 4 分。
示例3
输入：
9
1 2 1 3 2 2 2 2 3
复制
输出：
10
复制
说明：
第一步选择一个 2 ，然后所有 1 和 3 都被移除了，此时数组中剩下的是 [2,2,2,2] ，依次选择他们即可得到 10 分
*/


#include <iostream>
using namespace std;
const int N = 100010;
const int M = 10010;
int nums[N];
int _hash[M];
int f[M];
int g[M];

// 开始解题：
// 方法——动态规划
int main() {
    int n = 0;
    scanf("%d", &n);
    int _min = M;
    int _max = -1;
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
        _min = min(_min, nums[i]);
        _max = max(_max, nums[i]);
    }
    for (int i = 0; i < n; i++) {
        _hash[nums[i]] += nums[i];
    }
    f[_min] = _hash[_min];
    for (int i = _min + 1; i <= _max; i++) {
        f[i] = g[i - 1] + _hash[i];
        g[i] = max(f[i - 1], g[i - 1]);
    }
    cout << max(f[_max], g[_max]) << endl;
    return 0;
}